package dominio

import home.HomePlantas
import java.util.ArrayList
import org.eclipse.xtext.xbase.lib.Exceptions
import org.uqbar.commons.model.Entity
import org.uqbar.commons.utils.ApplicationContext
import org.uqbar.commons.utils.Observable
import java.util.Set
import applicationModel.Ataque
import java.util.Random

@Observable
class Zombie extends Entity implements Cloneable {

	@Property Integer vida
	@Property Integer potencia
	@Property String nombre
	@Property String descripcion
	@Property Planta plantaRecompensa
	@Property Integer dineroRecompensa

	override def toString() {
		getDescripcionEntera
	}

	def getDescripcionEntera() {
		getNombre + " Atk: " + getPotencia + " Vida: " + vida
	}

	def teAtaco(Planta planta) {
		vida = vida - planta.puntosDanio
	}

	def void recompensa(Ataque ataque) {
		if (this.daPremio) {
			this.elegirPremio(ataque)
		}
	}

	def boolean daPremio() {
		this.valor() <= 0.5
	}

	def boolean daPlanta() {
		this.valor() <= 0.25
	}
	
	def int valor(){
		var valor= new Random().nextInt(2)
		return valor
	}
	def void elegirPremio(Ataque ataque) {
		if (this.daPlanta) {
			recompensaPlanta(ataque)
		} else {
			ataque.recompensaDinero(dineroRecompensa)
		}

	}
	
	def recompensaPlanta(Ataque ataque) {
		val aux = new ArrayList<Planta>
		homePlantas.plantas.forEach[p|aux.add(p)]
		ataque.jugadorAtacado.plantas.forEach[p|aux.remove(p)]
		if (!aux.nullOrEmpty) {
			plantaRecompensa = aux.last
			ataque.recompensaPlanta(plantaRecompensa)
		} else {
			ataque.recompensaDinero(dineroRecompensa)
		}
	}

	override Object clone() {
		try {
			return super.clone()
		} catch (Throwable _e) {
			throw Exceptions.sneakyThrow(_e)
		}
	}

	def boolean vive() {
		getVida > 0
	}

	def getHomePlantas() {
		ApplicationContext::instance.getSingleton(typeof(Planta)) as HomePlantas
	}

}
